library(knitr)
library(png)

Résumé

Cet atelier Numérliab a pour objectif d’introduire la plateforme Google Earth Engine (EE) et certaines de ses fonctionnalités.

Earth Engine est un logiciel en ligne de la compagnie Google qui met à la disposition de ses utilisateurs une grande variété de couches géographiques (images satellitaires, données climatiques, topographiques, etc.), ainsi que des outils pour les analyser. L’avantage de EE est qu’une grande majorité des calculs sont faits directement par les serveurs de Google sur le cloud, donc beaucoup plus rapidement que sur un ordinateur personnel. Le but de cet atelier n’est pas d’apprendre un nouveau language de programmation, mais plutôt de présenter certains outils et codes reproductibles et adaptables à vos besoins.

Objectifs

Étape 1 : Introduction à l’interface EE

NOTE : AJOUT DE LIENS / MÉTHODES D’ACCÈS A EE? p-e un peu plus d’intro de base

Voici quelques informations pour vous retrouver dans l’interface

### NOTE: P-E grandir la figure un peu?

Panneau de gauche
- Bibliothèque où sont enregistrés tous vos codes
- Bibliothèque de GEE où sont les exemples de codes et la description des outils GEE
- Bibliothèque de vos propres couches (shapefiles, raster et autres bases de données).

Panneau du centre
- Éditeur de code où vous faites vos calculs

Panneau de droite
- Onglet d’inspection de la couche pour inspecter les métadonnées de votre carte (informations sur les couches et les pixels)
- Console des sorties où l’information des différentes cartes ou les graphiques s’affichent
- Gestionnaire de tâche pour les documents importés ou exportés

Barre de recherche
- Pour rechercher un lieu ou des couches de données

Carte
- Carte interactive où sont affichées vos couches calculées par-dessus une carte typique de Google

Étape 2 : Sélectionner un lieu d’intérêt à l’aide des outils de géométrie

Naviguer sur la carte jusqu’au Parc National de la Mauricie. Il est aussi possible de faire une recherche à l’aide de la barre de recherche, p. ex. “Shawinigan”.

  1. À l’aide de l’outil de géométrie, « ajouter un repère » en cliquant sur le pictogramme de repère et déposez-le au milieu du Parc national.
  2. Cliquer sur « exit » une fois que le repère est placé
  3. Renommer le nouveau repère « pnm » dans le haut de votre script

Alternative, utiliser la ligne de code suivante

var pnm = /* color: #d63000 */ee.Geometry.Point([-72.97, 46.74])

N’oubliez pas d’enregistrer votre code à l’aide du bouton enregistrer

Étape 3 : Charger et afficher une carte de l’élévation

Pour importer une couche, vous devrez la charger à partir de la banque de données de Earth Engine. Pour cela, il suffit de rechercher au sein du catalogue EE à l’aide de la barre de recherche et de l’importer. À noter que lorsqu’une couche est importée elle ne s’affichera pas directement. Comme aucunes limites n’ont été spécifiées pour cette couche, elle contient l’information reliée à une énorme superficie et le mieux est de la filtrer pour avoir un affichage autour d’un lieu d’intérêt. Voici un exemple avec des données d’élévation.

print(srtm);
Map.addLayer(srtm);

Map.addLayer(srtm, {min: 0, max: 400},"Élévation");
Map.addLayer(srtm, {min: 0, max: 400, palette: ['blue', 'yellow', 'red']},"Élévation colorée");

var ombre = ee.Terrain.hillshade(srtm);
Map.addLayer(ombre, {min: 150, max:255}, 'Ombre');

var pente = ee.Terrain.slope(srtm);
Map.addLayer(pente, {min: 0, max: 30}, 'Pente')

Étape 4 : Travailler avec des images satellitaires pour une région déterminée

Le catalogue de données de Google Earth Engine permet d’accéder à de nombreuses sources d’images satellitaires. Pour travailler sur d’un lieu d’intérêt, il faudra filtrer les données disponibles pour ce lieu pour une période donnée. Commencez par importer les images du satellite Sentinel 2 (aussi possible pour Landsat).

var pnm_s2=sent2.filterBounds(pnm)
                              .filterDate("2020-07-01", "2020-08-30")
                              .filterMetadata('CLOUDY_PIXEL_PERCENTAGE','less_than',10);

print(pnm_s2.size(),"n. images");
print(pnm_s2, "propriétés pnm_s2")
                              
var pnm_s2_best = ee.ImageCollection(sent2)
    .filterDate("2020-07-01", "2020-09-30")
    .filterBounds(pnm)
    .sort("CLOUD_COVERAGE_ASSESSMENT")
    .first();

print(pnm_s2_best,"meilleur image");
    
//extra : 2nd best?
var pnm_s2_2best = ee.ImageCollection(sent2)
    .filterDate("2020-07-01", "2020-09-30")
    .filterBounds(pnm)
    .sort("CLOUD_COVERAGE_ASSESSMENT")
    .tolist(2).get(1); 
print(pnm_s2_2best, "2e meilleur image")
      
var couleur_rgb = {
        bands: ["B4", "B3", "B2"],
        min: 0,
        max: 1850
        };

Map.addLayer(pnm_s2_best,couleur_rgb,"Image Sentinel-2");

Étape 5 : Sélectionner des images satellitaires selon les contours d’un shapefile

Dans les étapes précédentes, le lieu d’intérêt était le Parc National de la Maurice. Un repère a été placé à un endroit aléatoire dans le Parc. Il est cependant possible de travailler dans Earth Engine avec des superficies prédéterminées par exemple dans le cas d’un fichier shapefile. Pour ce faire, il vous faudra importer les fichiers shapefiles de votre ordinateur vers Google Earth Engine.

var pnm_poly = ee.FeatureCollection('users/XXX/PNM_poly');

Une fois le fichier shapefile importé, il est possible d’afficher la photo satellite seulement pour cette superficie avec l’outil «.clip » et le code suivant:

probablement besoin de démêler les différents calls. aussi, pourquoi la fonction median et pourquoi définir polygone

var polygone = pnm_s2_best.median();
Map.addLayer(polygone.clip(shape_pnm),couleur_rgb,"Image Satellite ajustée1");

ou encore

Map.addLayer(image.clip(shape_pnm),couleur_rgb,"Image Satellite ajustée2");

Alternative Arthur :

var pnm_clip = pnm_s2_best.clip(shape_pnm);
Map.addLayer(pnm_clip,couleur_rgb,"Image Satellite coupée");

Étape 6 : Calculer un indice spectrale (ex: NDVI)

Un autre exercice qui requiert peu de code avec Google Earth Engine est de créer une nouvelle couche de donnée qui contient une bande calculée comme l’indice NDVI (Normalized difference vegetation index).

Ce type d’index est souvent utilisé pour mettre en évidence certains éléments des images. Dans le cas du NDVI, il s’agit d’un ratio entre les réflectances des bandes rouge et proche infra-rouge qui permet de mettre en évidence la présence de végétation au sein d’une image.

\[NDVI = \frac{NIR-RED}{NIR+RED} \] Différentes méthodes permettent de créer une telle couche :

NOTE : ici j’Ai mis une version alternative de tes chunks avec des calls qui fonctionnaient mieux pour moi, je ne suis pas certain de pourquoi tu callais region.map et de l’utilité de maxNDVI, on en jasera

  1. utiliser une fonction
var ndvi = region.map (function (image) {
  var result=image.normalizedDifference(["B8", "B4"]).rename("NDVI"); 
  return image.addBands(result);
});
var maxNDVI= ndvi.select("NDVI");
Map.addLayer(maxNDVI, {min:0,max:1,palette:['red','yellow','green']},"NDVI Méthode1");

version Arthur :

var ndvi = function (pnm_clip) {
  var result=pnm_clip.normalizedDifference(["B8", "B4"]).rename("NDVI"); 
  return pnm_clip.addBands(result);
};

Map.addLayer(ndvi(pnm_clip), {bands:['NDVI'],min:0,max:1,palette:['red','yellow','green']},"NDVI Méthode1");
  1. faire un calcul de la différence des bandes dans une expression
var NDVI2 = image.expression(
     "(NIR - RED) / (NIR + RED)",
    {
      RED: image.select("B4"),    //  RED
      NIR: image.select("B8"),    // NIR
 });
Map.addLayer(NDVI2, {min: 0, max: 1,palette:['cyan','green','orange'] }, "NDVI Méthode 2");

version Arthur:

var ndvi2 = pnm_clip.expression(
     "(NIR - RED) / (NIR + RED)",
    {
      RED: image.select("B4"),
      NIR: image.select("B8"),
 });
Map.addLayer(ndvi2, {min: 0, max: 1,palette:['cyan','green','orange'] }, "NDVI Méthode 2");

Étape 7 : Faire une classification d’image à l’aide de Google Earth Engine

Le prochain exercice vise à introduire à la classification d’image à l’aide de Google Earth Engine. Le code ci-dessous permettra de faire une classification supervisée des différents types de paysages à partir d’image satellite. À l’aide d’un jeu de données préliminaires où les différents types de paysages sont connus, l’outil X permet d’extrapoler la classification à une plus grande échelle.

NOTE: outil à identifier, ça pourrait être considéré comme du machine learning de bas niveau

  • La première manipulation sera de créer les polygones du jeu de données d’entrainement. Faites attention à ne pas prendre de trop grosses superficies, sinon il pourrait y avoir une erreur lorsque vous exécuterez le code. À l’aide des outils de géométrie, créer un polygone dans un endroit boisé. Refaites cette manipulation pour des polygones que vous placerez dans une terre agricole, une étendue d’eau et en milieu urbain. Ces polygones s’appelleront respectivement « foret », « agricole », « eau » et « ville »

  • Ensuite, il faut ajouter une étiquette à chacun des polygones, un peu de la même manière qu’on ajoute des attributs à la table d’attribut d’un polygone dans un shapefile. Ces étiquettes seront utiles lorsqu’on assemblera les polygones dans une même couche. Pour ajouter une étiquette, aller dans les propriétés d’un polygone -> sélectionner « FeatureCollection » -> Ajouter une propriété -> la nommer « landcover » et lui donner une valeur de 0 -> Ok. Refaite de même avec les autres polygones où vous créerez une propriété nommée « landcover » et avec des valeurs de 1,2 et 3 respectivement. Après cela, chaque polygone devrait être rendu un objet « FeatureCollection ».

  • Il faut maintenant combiner les polygones ensemble dans une même couche. Utiliser le code suivant pour faire cet assemblage et voyer le résultat dans le panneau de droite.
var classNames = foret.merge(agricole).merge(eau).merge(ville);
print(classNames);

  • Vous êtes maintenant en mesure d’utiliser la couche précédente pour créer un jeu de données d’entrainement pour la classification à plus grande échelle. Le jeu de donnée d’entrainement va calculer quelles sont les valeurs des pixels reliés à chaque polygone pour les différentes bandes spectrales, ici les bandes 2 à 7.

NOTE: pourquoi 2 à 7? vite comme ça 2,3,4,8 serait probablement un meilleur choix

  • Vous pouvez maintenant faire le test de votre classification sur l’image satellite complète.

NOTE: ça pourrait être fait directement sur l’image crop du pnm+ndvi+srtm non? donc on évite d’avoir à regénérer le stack, je crois que si on tourne en rond on va prendre trop de temps

Étape 8 : Exportation vers un fichier raster via Google Drive

Il est possible d’exporter les couches créées dans Google Earth Engine pour continuer de les modifier dans des logiciels SIG. Par exemple, on pourrait vouloir exporter une partie de la classification précédente dans un fichier raster. Comme l’image satellite est relativement volumineuse, vous exporterez seulement une partie de la couche.

SUGGESTION: peut-être montrer qu’il est facile de faire le tout en batch pour genre toutes les images d’une année ou d’une série? je crois que c’est là la grosse force de EE